//package com.ls.fw.web.file.support.upload;
//
//import java.io.File;
//import java.io.UnsupportedEncodingException;
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//import org.apache.commons.fileupload.FileItem;
//import org.apache.commons.fileupload.FileUploadException;
//import org.apache.commons.fileupload.ProgressListener;
//import org.apache.commons.fileupload.disk.DiskFileItemFactory;
//import org.apache.commons.fileupload.servlet.FileCleanerCleanup;
//import org.apache.commons.fileupload.servlet.ServletFileUpload;
//import org.apache.commons.io.FileCleaningTracker;
//
//import com.ls.fw.commons.core.utils.file.FileUtil;
//import com.ls.fw.web.core.servlet.bean.AjaxResult;
//import com.ls.fw.web.core.servlet.bean.ValidResult;
//import com.ls.fw.web.file.bean.FileErrorInfo;
//import com.ls.fw.web.file.bean.FileLimit;
//import com.ls.fw.web.file.bean.FileInfo;
//import com.ls.fw.web.file.servlet.BaseFileServlet;
//import com.ls.fw.web.file.support.down.BaseDown;
//
///**
// * 上传文件基类
// * 参数:
// *  savename:保存名称
// *  relativeDir:保存相对目录
// * @author Defender
// * 2014年2月21日 下午7:17:20
// */
//public abstract class BaseUpload extends BaseFileServlet{
//
//	/**
//	 * 
//	 */
//	private static final long serialVersionUID = 1L;
//	
//	public static final long BASE_SIZE = 1024;
//	
//	//1GB
//	public static final long MAX_SIZE = BASE_SIZE*BASE_SIZE*BASE_SIZE*1;
//	
//	//文件临时路径
//	public static final  String tempdir = "tempdir";
//	//最大文件大小
//	public static final  String maxFileSize = "maxFileSize";
//    //最大内存大小
//	public static final  String maxMemSize = "maxMemSize";
//    //允许上传的类型
//	public static final  String allowType = "allowType";
//    //不允许上传的类型
//	public static final  String denyType = "denyType";
//
//	public static final  String maxSize = "maxSize";
//	
//	public static boolean openProgressListener = false;
//	
//	private final FileLimit fileLimit = new FileLimit();
//	protected String rootDir = "";
//	
//	@Override
//	public void init() throws ServletException {
//		super.init();
//		this.rootDir = this.getServletContext().getRealPath("/");
//		String str = this.getInitParameter("openProgressListener");
//		if(!isEmpty(str)){
//			try{
//				if("true".equalsIgnoreCase(str)){
//					openProgressListener = true;
//				}else{
//					openProgressListener = false;
//				}
//			}catch(Exception e){
//				this.log(e.getMessage(), e);
//			}
//		}
//		this.intFileLimit();
//	}
//	
//	/**
//	 * 初始化文件限制对象
//	 * @author Defender
//	 * 2014年2月21日 下午8:26:49
//	 */
//	private void intFileLimit(){
//		String baseDir = this.getInitParameter(BaseUpload.BASEDIR);
//		if(!isEmpty(baseDir)){
//			this.relativeDirPara = baseDir;
//			fileLimit.setBaseDir(baseDir);
//		}
//		String tempdir = this.getInitParameter(BaseUpload.tempdir);
//		fileLimit.setTempdir(tempdir);
//		String maxFileSize = this.getInitParameter(BaseUpload.maxFileSize);
//		if(!isEmpty(maxFileSize)){
//			try{
//				long size = this.getSize(maxFileSize);
//				if(size>MAX_SIZE){
//					size = MAX_SIZE;
//				}
//				fileLimit.setMaxFileSize(size);
//			}catch(Exception e){
//				this.log(e.getMessage(), e);
//			}
//		}
//		String maxMemSize = this.getInitParameter(BaseUpload.maxMemSize);
//		if(!isEmpty(maxMemSize)){
//			try{
//				long size = this.getSize(maxMemSize);
//				if(size>MAX_SIZE){
//					size = MAX_SIZE;
//				}
//				fileLimit.setMaxMemSize(Integer.parseInt(size+""));
//			}catch(Exception e){
//				this.log(e.getMessage(), e);
//			}
//		}
//		String allowType = this.getInitParameter(BaseUpload.allowType);
//		fileLimit.setAllowType(this.getType(allowType));
//		String denyType = this.getInitParameter(BaseUpload.denyType);
//		fileLimit.setDenyType(this.getType(denyType));
//		//私定
//		String _baseDir = this.getInitParameter(BaseDown.BASEDIR);
//		String _isAbsolutePath = this.getInitParameter(BaseDown.ISABSOLUTEPATH);
//		this.handlPara(_baseDir,_isAbsolutePath);
//		fileLimit.setBaseDir(this.baseDir);
//		fileLimit.setAbsoluteDir(this.isAbsolutePath);
//		
//		String maxSize = this.getInitParameter(BaseUpload.maxSize);
//		if(!isEmpty(maxSize)){
//			try{
//				long size = this.getSize(maxSize);
//				if(size>MAX_SIZE){
//					size = MAX_SIZE;
//				}
//				fileLimit.setMaxSize(size);
//			}catch(Exception e){
//				this.log(e.getMessage(), e);
//			}
//		}
//		this.log(this.fileLimit.toString());
//	}
//	
//	private String[] getType(final String type){
//		String[] strs = null; 
//		if(!isEmpty(type)){
//			strs = type.split(",");
//		}
//		return strs;
//	}
//
//	public String getSaveName(final HttpServletRequest request){
//		return (String) this.getParameter(request, SAVENAME);
//	}
//
//	/**
//	 * 处理单个文件
//	 * @author Defender 
//	 * 2014年5月27日上午9:06:12
//	 * @param request
//	 * @param response
//	 * @param item
//	 * @param baseDir
//	 * @param baseRelativeDir
//	 * @return
//	 * @throws Exception
//	 */
//	public FileInfo handlFile(final HttpServletRequest request, final HttpServletResponse response
//			, final FileItem item) throws Exception{
//		// Get the uploaded file parameters
//		String saveName = this.getSaveName(request);
//		if(this.isEmpty(saveName)){
//			saveName = this.getFileItemName(item);
//		}
//		if(this.isEmpty(saveName)){
//			Exception e = new Exception("上传的文件的保存名称不能为空！");
//			this.exceptionCaught(request, response,item, e);
//			throw e;
//		}
//		String baseRelativeDir = this.getSaveRelativeDir(request);
//		String path = baseDir+baseRelativeDir;
//		String newFileName = FileUtil.getFinalFileName(path, saveName);
//		boolean flag = false;
//		if(!newFileName.equals(saveName)){
//			flag = true;
//		}
//		FileInfo fileInfo = this.creatUploadFileInfo(item,baseRelativeDir,newFileName,flag);
//		path = this.checkDir(path);
//		File file = new File(path, newFileName);
//		try {
//			item.write(file);
//		} catch (Exception e) {
//			this.exceptionCaught(request, response,item, e);
//			throw e;
//		}finally{
//			try {
//				item.delete();
//			} catch (Exception e) {
//				this.log("删除FileItem出错！", e);
//			}
//		}
//		return fileInfo;
//	}
//	
//	/**
//	 * 保存相对目录
//	 * @author Defender 
//	 * 2014年6月19日下午9:46:13
//	 * @param request
//	 * @return
//	 */
//	public String getSaveRelativeDir(HttpServletRequest request) {
//		String dir =  this.getParameter(request, RELATIVEDIR);
//		if(!this.isEmpty(dir)){
//			if(!dir.startsWith(File.separator)){
//				dir = File.separator+dir;
//			}
//			if(!dir.endsWith(File.separator)){
//				dir = dir+File.separator;
//			}
//		}
//		return dir;
//	}
//	/**
//	 * 创建上传的文件实体
//	 * @author Defender
//	 * 2014年2月22日 上午12:39:23
//	 * @param item
//	 * @param saveDir
//	 * @param saveName
//	 * @return
//	 */
//	public FileInfo creatUploadFileInfo(final FileItem item,String saveRelativeDir,String saveName){
//		return this.creatUploadFileInfo(item,saveRelativeDir,saveName, false);
//	}
//	 
//	
//	/**
//	 * 创建上传的文件实体
//	 * @author Defender
//	 * 2014年2月22日 上午12:39:03
//	 * @param item
//	 * @param saveDir
//	 * @param saveName
//	 * @param existCommonName
//	 * @return
//	 */
//	public FileInfo creatUploadFileInfo(final FileItem item,String saveRelativeDir,String saveName,boolean existCommonName){
//		FileInfo fileInfo = new FileInfo();
//        fileInfo.setContentType(item.getContentType());
//        fileInfo.setSize(item.getSize());
//        fileInfo.setSizeStr(this.getSize(fileInfo.getSize()));
//		String fileName = this.getFileItemName(item);
//	    fileInfo.setSrcName(fileName);
//		fileInfo.setFileType(FileUtil.getFileExtension(fileName, false));
//		fileInfo.setSaveRelativeDir(saveRelativeDir);
//	    fileInfo.setSaveName(saveName);
//		fileInfo.setExistSameName(existCommonName);
//	   return fileInfo;
//	}
//	
//	
//	@Override
//	protected void handlRequest(final SubmitType submitType
//			, final HttpServletRequest request, final HttpServletResponse response){
//		try {
//			this.setEncoding(request, response);
//		} catch (UnsupportedEncodingException e) {
//			this.log("设置编码出错！", e);
//		}
//		//是否为文件格式的请求
//		boolean isMultipart =  this.isLegalRequest(request);
//		if( !isMultipart ){
//			this.illegalRequest(ValidResult.NO_MULTIPART,request, response);
//			return;
//		}else{
//			try {
//				this.upload(submitType, request, response);
//			} catch (Exception e) {
//				this.log("保存文件出错！", e);
//			}
//		}
//	}
//	
//
//	@SuppressWarnings("unchecked")
//	private void upload(final SubmitType submitType, final HttpServletRequest request
//			, final HttpServletResponse response) throws Exception{
//		ServletFileUpload fileUpload = this.initServletFileUpload(response,openProgressListener);
//		List<FileItem> items = null;
//		try {
//			items = fileUpload.parseRequest(request);
//		} catch (FileUploadException e) {
//			this.exceptionCaught(request, response,"获取request中的文件失败！", e);
//			throw e;
//		}
//		List<FileErrorInfo> list = this.validFileItem(items);
//		if(list==null || list.isEmpty()){
//			FileInfo[] fileInfo = null;
//			List<FileInfo> fileInfos = null;
//			boolean existItem = false;
//			if(items!=null && !items.isEmpty()){
//				fileInfos = new ArrayList<FileInfo>();
//				for (FileItem item : items) {
//					if (!item.isFormField() && item.getSize()>0) {
//						existItem = true;
//						FileInfo info = this.handlFile(request,response, item);
//						if(info!=null){
//							fileInfos.add(info);
//						}
//					}
//			    }
//				if(fileInfos!=null && !fileInfos.isEmpty()){
//					 fileInfo = fileInfos.toArray(new FileInfo[fileInfos.size()]);
//					 this.callback(request, response,fileInfo);
//				}
//			} 
//			if(!existItem){
//				this.illegalRequest(ValidResult.FAIL, request, response,"无文件！");
//			}
//		}else{
//			this.illegalRequest(ValidResult.FAIL, request, response,list.toArray(new FileErrorInfo[list.size()]));
//		}
//	}
//	
//	/**
//	 * 初始化ServletFileUpload
//	 * @author Defender
//	 * 2014年2月22日 上午11:39:29
//	 * @return
//	 */
//	private ServletFileUpload initServletFileUpload(final HttpServletResponse response, final boolean openProgreeListener){
//		  DiskFileItemFactory factory = new DiskFileItemFactory();
//	      // maximum size that will be stored in memory
//		  if(this.fileLimit.getMaxMemSize()>0){
//			  factory.setSizeThreshold(this.fileLimit.getMaxMemSize());
//		  }
//	      // Location to save data that is larger than maxMemSize.
//	      if(!this.isEmpty(this.fileLimit.getTempdir())){
//	    	  factory.setRepository(new File(this.fileLimit.getTempdir()));
//	      }
//	      //追踪临时文件并删除
//	      FileCleaningTracker pTracker = FileCleanerCleanup.getFileCleaningTracker(this.getServletContext());
//	      factory.setFileCleaningTracker(pTracker);
//	     
//	      // Create a new file upload handler
//	      final ServletFileUpload upload = new ServletFileUpload(factory);
//	      // maximum file size to be uploaded.
//	      if(this.fileLimit.getMaxFileSize()>0){
//	    	  //设置上传文件最大值
//	    	  upload.setFileSizeMax(this.fileLimit.getMaxFileSize());
//	      }
//	      if(this.fileLimit.getMaxSize()>0){
//	    	  //设置上传文件总量的最大值
//	    	  upload.setSizeMax(this.fileLimit.getMaxSize());
//	      }
//	      upload.setHeaderEncoding("UTF-8");  
//	      if(openProgreeListener){
//		      upload.setProgressListener(new ProgressListener() {
//			    	private double megaBytes = -1.0;
//			    	private long unit = 1L;
//			    	private boolean hasUnit = false;
//			    	private int lastItem = 0;
//					@Override
//					public void update(long pBytesRead, long pContentLength, int pItems) {
//						if(pItems==0){
//							return;
//						}
//						if(lastItem!=pItems){
//							lastItem = pItems;
//							//init();
//						}
//						if(!hasUnit){
//							int index = getIndex(pContentLength);
//							index--;
//							while(index>0){
//								unit *= BASE_SIZE;
//								index--;
//							}
//							hasUnit = true;
//						}
//						progress(response,megaBytes,unit,pBytesRead,pContentLength,pItems);
//						if(pBytesRead>=pContentLength){
//							this.init();
//						}
//					}
//					
//					private void init(){
//						hasUnit = false;
//						unit = 1L;
//						megaBytes = -1.0;
//					}
//			  });
//	      }
//	      return upload;
//	}
//	
//	/**
//	 * 上传文件进度
//	 * @author Defender
//	 * 2014年2月22日 下午3:24:11
//	 * @param megaBytes
//	 * @param pBytesRead
//	 * @param pContentLength
//	 * @param pItems
//	 */
//	public abstract void progress(HttpServletResponse response,double megaBytes,final long lastReadBytes
//			,long pBytesRead, long pContentLength, int pItems);
//
//	/**
//	 * 文件域检验结果
//	 * @author Defender
//	 * 2014年2月22日 上午11:39:01
//	 * @param items
//	 * @return
//	 */
//	private List<FileErrorInfo> validFileItem(final List<FileItem> items){
//		List<FileErrorInfo> list = new ArrayList<FileErrorInfo>();
//		if(items!=null){
//			for (FileItem item : items) {
//				if (!item.isFormField()&&item.getSize()>0) {
//					String fileName = this.getFileItemName(item);
//					String ext = FileUtil.getFileExtension(fileName, false);
//					if(!this.isValidExt(ext)){
//						FileErrorInfo info = new FileErrorInfo();
//						info.setFileName(fileName);
//						info.setMsg("不允许上传以【"+ext+"】为后缀的文件！");
//						list.add(info);
//					}
//					if(this.fileLimit.getMaxFileSize()>0){
//						long size = item.getSize();
//						if(size>this.fileLimit.getMaxFileSize()){
//							FileErrorInfo info = new FileErrorInfo();
//							info.setFileName(fileName);
//							info.setMsg("不允许上传超过"+this.getSize(this.fileLimit.getMaxFileSize())+"的文件！");
//							list.add(info);
//						}
//					}
//				}
//			}
//		}
//		return list;
//	}
//	
//	protected String getSize(double size){
//		int index = 0;
//		if(size>=BASE_SIZE){
//			return getSize(size/BASE_SIZE,++index);
//		}
//		BigDecimal b= new BigDecimal(size);
//		double f1 =  b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//		return f1+getUnit(index);
//	}
//	
//	/**
//	 * 获取长度的索引：0:B,1:KB,2:MB:3:GB，4：TB
//	 * @author Defender
//	 * 2014年2月22日 下午4:32:37
//	 * @param size
//	 * @return
//	 */
//	protected int getIndex(long size){
//		int index = 0;
//		if(size>=BASE_SIZE){
//			return getIndex(size/BASE_SIZE,++index);
//		}
//		return index;
//	}
//	
//	
//	/**
//	 * 获取长度的索引：0:B,1:KB,2:MB:3:GB，4：TB
//	 * @author Defender
//	 * 2014年2月22日 下午4:33:37
//	 * @param size
//	 * @param index
//	 * @return
//	 */
//	protected int getIndex(long size,int index){
//		if(size>=1024){
//			return getIndex(size/BASE_SIZE,++index);
//		}
//		return index;
//	}
//	
//	protected String getSize(double size,int index){
//		if(size>=BASE_SIZE){
//			return getSize(size/BASE_SIZE,++index);
//		}
//		BigDecimal b= new BigDecimal(size);
//		double f1 =  b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//		return f1+getUnit(index);
//	}
//	
//	private String getUnit(int index){
//		String unit = "B";
//		switch(index){
//			case 0: unit = "B";break;
//			case 1: unit = "KB";break;
//			case 2: unit = "MB";break;
//			case 3: unit = "GB";break;
//			case 4: unit = "TB";break;
//			default : unit = "B";break;
//		}
//		return unit;
//	}
//	
//	
//	/**
//	 * 获取大小：如：3KB，3*1024B
//	 * @author Defender
//	 * 2014年2月21日 下午11:19:08
//	 * @param size
//	 * @return
//	 */
//	protected long getSize(final String size){
//		int index = 0;
//		long m_size = 0L;
//		int _index = -1;
//		String m_sizeStr = size.toUpperCase();
//		if(m_sizeStr.endsWith("K")){
//			index = 1;
//			_index = size.lastIndexOf(size.substring(size.length()-1));
//		}else if(m_sizeStr.endsWith("KB")){
//			index = 1;
//			_index = size.lastIndexOf(size.substring(size.length()-2));
//		}else if(m_sizeStr.endsWith("M")){
//			index = 2;
//			_index = size.lastIndexOf(size.substring(size.length()-1));
//		}else if(m_sizeStr.endsWith("MB")){
//			index = 2;
//			_index = size.lastIndexOf(size.substring(size.length()-2));
//		}else if(m_sizeStr.endsWith("G")){
//			index = 3;
//			_index = size.lastIndexOf(size.substring(size.length()-1));
//		}else if(m_sizeStr.endsWith("GB")){
//			index = 3;
//			_index = size.lastIndexOf(size.substring(size.length()-2));
//		}else if(m_sizeStr.endsWith("T")){
//			index = 4;
//			_index = size.lastIndexOf(size.substring(size.length()-1));
//		}else if(m_sizeStr.endsWith("TB")){
//			index = 4;
//			_index = size.lastIndexOf(size.substring(size.length()-2));
//		}else if(m_sizeStr.endsWith("B")){
//			index = 0;
//			_index = size.lastIndexOf(size.substring(size.length()-1));
//		}else{
//			m_size = Long.parseLong(size);
//		}
//		if(_index>-1){
//			m_size = Long.parseLong(size.substring(0, _index));
//		}
//		while(index>0){
//			m_size *= BASE_SIZE;
//			index--;
//		}
//		return m_size;
//	}
//	
//	
//	protected int getUnitIndex(final String size){
//		int index = 0;
//		String m_size = size.toUpperCase();
//		if(m_size.endsWith("K")){
//			index = 1;
//		}else if(m_size.endsWith("KB")){
//			index = 1;
//		}else if(m_size.endsWith("M")){
//			index = 2;
//		}else if(m_size.endsWith("MB")){
//			index = 2;
//		}else if(m_size.endsWith("G")){
//			index = 3;
//		}else if(m_size.endsWith("GB")){
//			index = 3;
//		}else if(m_size.endsWith("T")){
//			index = 4;
//		}else if(m_size.endsWith("TB")){
//			index = 4;
//		}else if(m_size.endsWith("B")){
//			index = 0;
//		} 
//		return index;
//	}
//	
//	/**
//	 * 是否是允许的文件后缀
//	 * @author Defender
//	 * 2014年2月21日 下午10:33:51
//	 * @param ext
//	 * @return
//	 */
//	private boolean isValidExt(final String ext){
//		boolean flag = false;
//		String[] type = this.fileLimit.getDenyType();
//		boolean deny = false;
//		boolean allow = true;
//		if(type!=null){
//			deny = this.match(type, ext);
//		}
//		if(!deny){
//			type = null;
//			type = this.fileLimit.getAllowType();
//			if(type!=null){
//				allow = this.match(type, ext);
//			}
//		}
//		if(allow && !deny){
//			flag = true;
//		}
//		return flag;
//	}
//	
//
//	/**
//	 * 上传文件类型是否匹配要求的
//	 * @author Defender
//	 * 2014年2月21日 下午10:17:31
//	 * @param type
//	 * @param extension
//	 * @return
//	 */
//	protected boolean match(final String[]type, final String extension){
//		boolean flag = false;
//		String str = ("*."+extension).toUpperCase();
//		if(type!=null){
//			for (String string : type) {
//				if(!string.startsWith("*.")){
//					string = "*."+string;
//				}
//				if(str.equalsIgnoreCase(string.toUpperCase())){
//					flag = true;
//					break;
//				}
//			}
//		}
//		return flag;
//	}
//	
//	/**
//	 * 获取文件名称
//	 * @author Defender
//	 * 2014年2月21日 下午8:51:33
//	 * @param item
//	 * @return
//	 */
//	protected String getFileItemName(final FileItem item) {
//		Pattern p = Pattern.compile("[^\\\\/]+$");
//		Matcher m = p.matcher(item.getName());
//		return (m.find()) ? m.group(0) : "";
//	}
//	
//	
//	@Override
//	protected boolean isLegalRequest(HttpServletRequest request){
//		//判断上传表单是否为上传表单类型
//		return ServletFileUpload.isMultipartContent(request);
//	}
//	
// 
//	@Override
//	protected void exceptionCaught(HttpServletRequest request, HttpServletResponse response
//			, Object msg,Throwable throwable){
//		this.log(msg.toString(), throwable);
//		Map<String,Object> map = new HashMap<String,Object>(2);
//		map.put(STATUS_CODE, AjaxResult.FAIL);
//		map.put(RESULT, msg);
//		map.put(MSG, throwable.getMessage());
//		this.sendJSONObject(response,map);
//	}
//	
//	@Override
//	protected void illegalRequest(ValidResult validResult, HttpServletRequest request, HttpServletResponse response, Object... paras) {
//		this.log("执行illegalRequest");
//		Map<String,Object> map = new HashMap<String,Object>(2);
//		map.put(STATUS_CODE, AjaxResult.FAIL);
//		if(paras==null){
//			map.put(MSG, validResult.getDesc());
//		}else{
//			map.put(MSG, paras);
//		}
//		map.put(RESULT, "");
//		this.sendJSONObject(response,map);
//	}
//	
//	@Override
//	protected void callback(HttpServletRequest request, HttpServletResponse response,
//			Object... paras) {
//		Map<String,Object> map = new HashMap<String,Object>(2);
//		map.put(STATUS_CODE, AjaxResult.SUCCESS);
//		if(paras!=null){
//			map.put(RESULT, paras);
//		}
//		map.put(MSG, "上传成功");
//		String msg = this.sendJSONObject(response,map);
//		this.log("上传成功:"+msg);
//
//	}
//}
